#include "stdint.h"
#include <types.h>
#include <ebraid.h>
#include <kernel/initcall.h>
#include "drivers/irq.h"
#include <drivers/gpio.h>
#include <kernel/syslog.h>
#include <kernel/kobject.h>
// #include <stdio.h>
#include <irq_num.h>
#include "stm32f10x.h"
#include <drivers/uart.h>
#include <lib/eb_string.h>



void uart_handler(void)
{
    char buf[100] = "45454";
    // scanf("%s", &buf);
    // printf("%s\n", buf);
}


#define GPIOC_CLK (*(volatile unsigned int *)(0x40021000 + 0x18))   //确定GPIOC的外设使能寄存器的地址（RCC地址+偏移地址APB2）
#define GPIOC_CRH (*(volatile unsigned int *)(0x40011000 + 0x04))	//确定GPIOC的端口配置寄存器CRL(GPIOC的基地址+端口配置高寄存器CRH的偏移地址)
#define GPIOC_ODR (*(volatile unsigned int *)(0x40011000 + 0x0C))	//确定GPIOC的端口输出数据寄存器ODR（GPIOC的基地址+端口输出数据寄存器ODR的偏移地址）


#define EXIT_IMR_REG           EXTI_BASE
#define EXIT_EMR_REG          (EXTI_BASE + 0x04)
#define EXIT_RTSR_REG         (EXTI_BASE + 0x08)
#define EXIT_FTSR_REG         (EXTI_BASE + 0x0C)
#define EXIT_SWIER            (EXTI_BASE + 0x10)

static void delay(int delay)
{
    for(volatile int i = 0; i<delay; i++)
        for(volatile int j=0;j<1000;j++);
}


void test_dummy()
{
    RCC->APB1ENR|=(1<<17);           //开启USART1时钟和GPIOA时钟
    RCC->APB2ENR|=(1<<14)|(1<<2);           //开启USART1时钟和GPIOA时钟
    RCC->APB2RSTR|=(1<<14);                 //复位外设USART1
    RCC->APB2RSTR&=(~(1<<14));              //停止复位
    GPIOC_CLK |= (1<<4);                     //给IO端口C时钟使能
    RCC->APB2ENR |= (1<<2)|(1<<0);           //开启USART1时钟和GPIOA时钟
    RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
}

void test_exit_handler(void)
{
    EXTI->PR|=(1<<1);              //清除中断标志位，写入1即可
    gpio_toggle_value(IO_PC13);
}


int main(void)
{
    test_dummy();
    ebraid_sys_start();
    
    int ret = gpio_request(IO_PC13);
    if(ret) {
        return 0;
    }

    gpio_direction_output(IO_PC13, IO_LOW);

    gpio_set_value(IO_PC13, 1);

    while(1) {
        gpio_set_value(IO_PC13, 0);
        delay(1000);
        gpio_set_value(IO_PC13, 1);
        delay(1000);
    }
    return 0;
}
